import json
from typing import List, Optional, ForwardRef

from pydantic import BaseModel, Field

# 使用ForwardRef解决递归引用问题
BaseCategory = ForwardRef('BaseCategory')


class BaseCategory(BaseModel):
    category_name: str = Field(alias="categoryName")  # 映射categoryName
    category_id: str = Field(alias="categoryId")  # JSON中categoryId是字符串
    children: List[BaseCategory] = Field(default_factory=list)  # 子分类列表


# 解决BaseCategory的循环引用
BaseCategory.update_forward_refs()

# 扩展Lazada专用分类模型
LazadaCategory = ForwardRef('LazadaCategory')


class LazadaCategory(BaseCategory):
    # 重写父类的category_id字段，使用不同的别名
    # category_id: str = Field(alias="id")
    # 修正category_url的映射，应该使用正确的别名（这里假设是"url"，根据实际JSON调整）
    category_url: str = Field(default='',alias="categoryUrl")

    # 映射二级分类列表，递归使用LazadaCategory
    children: List[LazadaCategory] = Field(default_factory=list, alias="level2TabList")


# 解决LazadaCategory的循环引用
LazadaCategory.update_forward_refs()


def load_json_to_model(json_str: str) -> List[LazadaCategory]:
    """将JSON字符串解析为LazadaCategory列表"""
    try:
        # 先解析为Python列表，再验证模型
        data = json.loads(json_str)
        # 如果根节点是数组，需要逐个验证
        return [LazadaCategory.model_validate(item) for item in data]
    except json.JSONDecodeError as e:
        raise ValueError(f"JSON格式错误: {e}")
    except Exception as e:
        raise ValueError(f"模型解析失败: {e}")


def load_json_file_to_model(file_path: str) -> List[LazadaCategory]:
    """从JSON文件读取数据并解析为模型"""
    with open(file_path, "r", encoding="utf-8") as f:
        json_str = f.read()
    return load_json_to_model(json_str)